package com.jd.controller.center;

import com.jd.bo.center.CenterUserBO;
import com.jd.controller.BaseController;
import com.jd.pojo.User;
import com.jd.resource.FileUpload;
import com.jd.service.center.CenterUserService;
import com.jd.utils.CookieUtils;
import com.jd.utils.DateUtil;
import com.jd.utils.JDJSONResult;
import com.jd.utils.JsonUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.bind.BindResult;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Api(value = "用户信息接口",tags = {"用户信息接口"})
@RestController
@RequestMapping("userInfo")
public class CenterUserController extends BaseController {

    @Autowired
    private CenterUserService centerUserService;

    @Autowired
    private FileUpload fileUpload;

    @ApiOperation(value = "修改用户信息",notes = "修改用户信息",httpMethod = "POST")
    @PostMapping("/update")
    public JDJSONResult update(@ApiParam(name="userId",value = "用户id",required = true)
                               @RequestParam String userId,
                               @RequestBody @Valid CenterUserBO centerUserBO,
                               BindingResult result,
                               HttpServletRequest request, HttpServletResponse response){
        //判断BindReuslt是否保存错误信息,则直接return
        if(result.hasErrors()){
            Map<String,String> errorMap=getErrors(result);
            return JDJSONResult.errorMap(errorMap);
        }


        User userResult= centerUserService.updateUserInfo(userId,centerUserBO);
        userResult=setNullProperty(userResult);
        //把用户信息存储到cookie
        CookieUtils.setCookie(request,response,"user",
                JsonUtils.objectToJson(userResult),true);
        //TODO 后续要改，增加令牌token，会整合redis，分布式会话
        return JDJSONResult.ok(userResult);
    }


    @ApiOperation(value = "用户头像修改",notes = "用户头像修改",httpMethod = "POST")
    @PostMapping("/uploadFace")
    public JDJSONResult uploadFace(@ApiParam(name="userId",value = "用户id",required = true)
                               @RequestParam String userId,
                               @ApiParam(name="file",value = "用户头像",required = true)
                               MultipartFile file,
                               HttpServletRequest request, HttpServletResponse response){

        //定义头像的保存的地址
        String fileSpace=fileUpload.getImageUserFaceLocation();
        //在路径上为每一个用户添加一个userId,用于区分不同用户上传
        String uploadPathPrefix= File.separator+userId;

        //开始文件上传
        if(file!=null){
            FileOutputStream fileOutputStream=null;
            //获得文件上传的文件名称
            try {
                String fileName=file.getOriginalFilename();
                if(StringUtils.isNotBlank(fileName)){
                    //文件重命名  imooc-face.png-> [imooc-face,png]
                    String fileNameArr[]=fileName.split("\\.");
                    //获取文件的后缀名
                    String stufiix=fileNameArr[fileNameArr.length-1];

                    if(!stufiix.equalsIgnoreCase("png")&&
                            !stufiix.equalsIgnoreCase("jpg")&&
                            !stufiix.equalsIgnoreCase("jpeg")){
                        return JDJSONResult.errorMsg("图片格式不正确");
                    }

                    //face-{userid}.png
                    //文件名称重组，覆盖式上传，增量公式：额外拼接当前时间
                    String newFileName="face-"+userId+"."+stufiix;
                    //上传的头像最终要保存的位置
                    String finalFacePath=fileSpace+uploadPathPrefix+File.separator+newFileName;
                    //用于提供web服务访问的地址
                    uploadPathPrefix+=("/"+newFileName);

                    File outFile=new File(finalFacePath);
                    if(outFile.getParentFile()!=null){
                        outFile.getParentFile().mkdirs();
                    }
                    //文件输出保存到目录
                    fileOutputStream=new FileOutputStream(outFile);
                    InputStream inputStream=file.getInputStream();
                    IOUtils.copy(inputStream,fileOutputStream);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    if(fileOutputStream!=null){
                        fileOutputStream.flush();
                        fileOutputStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }else{
            return JDJSONResult.errorMsg("文件不能为空");
        }
        //服务地址
        String imageServerUrl=fileUpload.getImageServerUrl();
        //由于浏览器可能存在缓冲的清空，所以在这里，我们需要加上时间戳
        String finalUserFaceUrl=imageServerUrl+uploadPathPrefix+"?t="+ DateUtil.getCurrentDateString(DateUtil.DATE_PATTERN);
        //更新用户头像到数据库
        User userResult=centerUserService.updateUserFace(userId,finalUserFaceUrl);
        userResult=setNullProperty(userResult);
        //把用户信息存储到cookie
        CookieUtils.setCookie(request,response,"user",
                JsonUtils.objectToJson(userResult),true);
        //TODO 后续要改，增加令牌token，会整合redis，分布式会话
        return JDJSONResult.ok();
    }


    private Map<String,String> getErrors(BindingResult result){
        Map<String,String> map=new HashMap<>();
        List<FieldError> errorList=result.getFieldErrors();
        for(FieldError error:errorList){
            //发生验证错误所对应的某个熟悉
            String errorField=error.getField();
            //验证错误的信息
            String errorMsg=error.getDefaultMessage();
            map.put(errorField,errorMsg);
        }
        return map;
    }



    private User setNullProperty(User userResult){
        userResult.setPassword(null);
        userResult.setMobile(null);
        userResult.setEmail(null);
        userResult.setCreatedTime(null);
        userResult.setUpdatedTime(null);
        userResult.setBirthday(null);
        return userResult;
    }




}
